package com.rybbaby.tss.core.web.service;

import com.rybbaby.tss.core.bean.PageBean;
import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public interface IViewService<T> {

    /**
     * 根据Id获取一个实体对象
     *
     * @param id 主键id
     */
    public abstract T get(Class<T> viewClass, Serializable id);

    /**
     * 根据属性值该实体的唯一记录，如果有多条记录，将返回第一条记录
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */
    public abstract T findUniqueByProperty(Class<T> viewClass, String propertyName, Object value);

    /**
     * 根据属性值该实体类的记录
     *
     * @param propertyName 属性名
     * @param value        属性值
     * @return
     */

    public abstract List<T> findByProperty(Class<T> viewClass, String propertyName, Object value);

    /**
     * 加载某一个实体的所有数据
     */

    public abstract List<T> loadAll(Class<T> viewClass);

    /**
     * 通过hql 查询语句查找对象，并以实体类型集合返回
     *
     * @param hql hql语句
     * @return
     */

    public abstract List<T> findByHql(String hql);


    /**
     * 通过sql查询语句查找对象
     *
     * @param sql    查询类型sql语句，sql语句中的查询库字段别名，必须是cls参数中存在的属性名
     * @param params SQL语句中的参数，请注意参数与sql语句中参数暂未符?的对应关系
     * @return
     * @throws Exception
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public abstract List<T> findListBySql(Class<T> viewClass, String sql, Object... params) throws Exception;

    /**
     * 将原生sql返回的结果集注入到指定的可不受Hibernate管制实体bean中（待测试）
     *
     * @param viewClass     封装查询数据的对象（此参数可以不受Hibernate管制，普通的pojo即可）
     * @param sql           查询语句
     * @param columnAliases 手动指定需要返回的数据库字段别名，别名必须是cls参数中存在的属性名
     * @param params        SQL语句中的参数，请注意参数与sql语句中参数暂未符?的对应关系
     * @return
     */
    public abstract List<T> findListBySql(Class<T> viewClass, String sql, String[] columnAliases, Object... params) throws Exception;

    /**
     * 根据属性值该实体类的记录
     *
     * @param viewClass     封装查询数据的对象（此参数可以不受Hibernate管制，普通的pojo即可）
     * @param propertyName 属性名
     * @param value        属性值
     * @param isAsc        是否升序排列
     */

    public abstract List<T> findByPropertyisOrder(Class<T> viewClass, String propertyName, Object value, boolean isAsc);

    /**
     * 执行hql语句查询查找对象
     *
     * @param hql    hql语句
     * @param params 参数
     */

    public abstract List<T> findByHql(String hql, Object[] params);

    /**
     * 通过DetachedCriteria查询指定下标开始查询指定数据量的的数据集
     *
     * @param dc       查询条件对象
     * @param pageNo   当前页
     * @param pageSize 每一页显示的记录数
     */

    public abstract PageBean pageList(DetachedCriteria dc, int pageNo, int pageSize);

    /**
     * 使用指定的检索标准检索数据并分页返回数据
     *
     * @param sql      要执行查询的sql，此sql只需要专注查询，不需要写分页相关的代码
     * @param pageNo   当前页
     * @param pageSize 每一页显示的记录数
     * @return
     */
    public PageBean pageList(String sql, int pageNo, int pageSize);

    /**
     * 通过hql 查询语句查找对象,并以键值对返回
     *
     * @param hql hql语句
     * @return
     */
    public abstract Map<Object, Object> getHashMapbyHql(String hql);
}
